package cool.lichuan.config;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dreamlu.iot.mqtt.core.server.auth.IMqttServerAuthHandler;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.tio.core.ChannelContext;
import org.tio.utils.hutool.StrUtil;

/**
 * MQTT服务端认证
 *
 * @author lichuan
 * @since 2025/6/7 19:35
 */
@Configuration(proxyBeanMethods = false)
@Slf4j
@RequiredArgsConstructor
public class MqttAuthListener implements IMqttServerAuthHandler {

    @Value("${mqtt.server.auth.username}")
    private String authUserName;
    @Value("${mqtt.server.auth.password}")
    private String authPassword;

    @Override
    public boolean authenticate(ChannelContext context, String uniqueId, String clientId, String userName, String password) {
        // 下面我们简单以配置文件的用户名、密码作为检验，你也可以自定义逻辑，甚至每个设备有单独的用户名、密码
        boolean auth = authUserName.equals(userName) && authPassword.equals(password);
        if (!auth) {
            log.error("客户端：{}用户名或密码不正确，不能连接。用户名：{}，密码：{}", clientId, userName, password);
            return false;
        }
        if (StrUtil.isBlank(clientId)) {
            log.error("客户端：{}为空，不能连接", clientId);
            return false;
        }

        // TODO 比如可以从缓存中判断clientId是否存在，不存在的可以不接收
        // TODO 比如我们可以判断clientId是否被拉黑
        // TODO 比如我们可以通过ChannelContext判断IP是否被拉黑

        log.info("客户端：{}；用户名：{}；密码：{}，服务端连接成功", clientId, userName, password);
        return true;
    }
}
